﻿using System;
using System.Collections.Generic;
using System.Text;

namespace AlgorithmTest
{
    // T_[四个数字排序]_[算法名]
    public class T_0035_ReverseWords : IAlgorithm
    {
        // 557. 反转字符串中的单词 III

        // 给定一个字符串，你需要反转字符串中每个单词的字符顺序，同时仍保留空格和单词的初始顺序。

        // 提示：
        //  在字符串中，每个单词由单个空格分隔，并且字符串中不会有任何额外的空格。

        // 示例：
        //  输入："Let's take LeetCode contest"
        //  输出："s'teL ekat edoCteeL tsetnoc"

        public void Test()
        {
            // 算法参数定义
            //var s = "Let's take LeetCode contest";
            var s = "i love u";
            // 算法执行与打印
            Console.WriteLine(ReverseWords(s));
        }

        // 算法
        // 先转字符数组，以空格为断点记录起终点双指针并反转，最后转字符串输出
        public string ReverseWords(string s)
        {
            var sCharArray = s.ToCharArray();
            int l = 0, r = 0;
            for (int i = 0; i < sCharArray.Length; i++)
            {
                // 此处需注意结尾不为空格的情况
                if (sCharArray[i] == ' ' || i == sCharArray.Length - 1)
                {
                    if (i == sCharArray.Length - 1)
                        r = i;
                    while (l < r)
                    {
                        var temp = s[r];
                        sCharArray[r--] = sCharArray[l];
                        sCharArray[l++] = temp;
                    }
                    l = r = i + 1;
                }
                else
                    r = i;
            }
            return new string(sCharArray);
        }
    }
}
